package com.itany.corejava.code07_常用类.string;

/**
 * @author MissChen
 * @date 2024年02月29日 16:23
 */
public class Test11_常量池 {
    public static void main(String[] args) {

        // 通过构造方法创建的字符串，都是存储在堆中
        String s=new String("admin");

        s=new String("tom");

        //存储在队中
        String s2=new String("admin");

        //通过双引号创建的字符串都是存储在常量池中
        //在常量池中开辟了一块新的空间，其值为admin
        String s3="admin";
        s3="tom";
        //由于常量池中已经存在admin的存储空间
        // 因此s4没有开辟新的空间，而是直接指向原有的admin空间
        String s4="admin";
        String s5=new String("admin");
        System.out.println(s2==s5);//s2与s5所在的内存空间地址不同，所以为false

        String s6="admin";
        //s4与s6都在常量池中，处于同一块空间，因此为true
        System.out.println(s4==s6);//true
        System.out.println("-----");
        String s7="a";
        String s8="aa";
        String s9="aaa";
        String s10=s7+s8;
        //s10不是字符常量，其值是运行时确定的，而不是通过双引号直接赋值的
        //当运行前不确定的值是不会被存放到常量池中的
        // 因此，s10存储在堆中的
        System.out.println(s9==s10);

        //由于此时运行前已经确定所有的值，因此直接存储到常量池中
        String s11="a"+"aa";
        System.out.println(s9==s11);

        String s12="a"+s8;
        System.out.println(s9==s12);//false

        //堆中开辟了6次空间，常量池中5次









    }
}
